## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
## 
## Attaching package: 'stationery'
## The following object is masked from 'package:knitr':
## 
##     rnw2pdf

Subindexado de vectores atómicos

El subindexado de vectores atómicos permite obtener partes de un vector atómico (los primeros elementos, los 10 últimos, etc.) y es útil en muchos tipos de análisis que suceden en diversas ramas de la ciencia. Supongamos que tenemos lo siguiente:

dnormales <- rnorm(20)    # 10 numeros aleatorios de una dist. normal
dnormales   # Imprimimos el vector
 [1]  0.65326200 -0.39528316 -0.42493054 -1.23432215  1.85039505 -2.74241018
 [7] -0.46082527 -0.72774323 -1.11305319 -0.72724669 -0.11484548 -0.97613349
[13]  0.53021026  0.51301108  0.73903265 -0.35484618 -0.06464238  0.94993502
[19]  0.55424980  0.21638871

Ejercicios:

1.- ?Cuál es el resultado de dnormales[order(x)], dnormales[1:length(vec)], dnormales[-20], dnormales[vec>0.5]?

dnormales <- rnorm(20)
dnormales[order(dnormales)]
 [1] -2.42636461 -1.66617289 -1.41921131 -1.27294904 -1.08847843 -1.04876210
 [7] -1.01404592 -0.83932325 -0.77528437 -0.63566196 -0.31240272 -0.12597816
[13]  0.01420907  0.35485379  0.44227851  0.47084210  0.78049889  0.84165032
[19]  1.17609340  1.97131351
dnormales <- rnorm(20)
dnormales[1:length(dnormales)]
 [1]  0.73314972 -0.51035534  0.90352246  0.69173390  0.64498622  1.38977318
 [7] -0.29062007 -0.06668841  0.80119634  1.35024792 -0.83194687 -1.60368914
[13] -1.09920704 -0.46311371 -0.51303307 -0.05905544  1.73765469  0.59022979
[19]  0.13694610 -0.11977901
dnormales
 [1]  0.73314972 -0.51035534  0.90352246  0.69173390  0.64498622  1.38977318
 [7] -0.29062007 -0.06668841  0.80119634  1.35024792 -0.83194687 -1.60368914
[13] -1.09920704 -0.46311371 -0.51303307 -0.05905544  1.73765469  0.59022979
[19]  0.13694610 -0.11977901
dnormales <- rnorm(20)
dnormales[-20]
 [1] -1.05295836 -0.36588722 -0.31644633 -0.37355889  1.75229115  0.20099583
 [7] -1.38344270  1.99989471 -1.16492590  1.00245824 -1.11914395  0.71800121
[13]  0.05743746 -1.48436294  0.48949656 -1.30832196 -0.88358558 -0.16769191
[19]  1.76742017
dnormales <- rnorm(20)
dnormales[dnormales>0.5]
[1] 1.1278274 1.0519932 0.9818293 0.5399867 1.4412576

2.- ?Qué sucede si hacemos dnormales[0:3]? ?Cuál es la longitud del vector?

dnormales <- rnorm(20)
length(dnormales)
[1] 20
dnormales[0:3]
[1] -0.4130547  1.2613171 -0.9227400
length(dnormales[0:3])
[1] 3

3.- Ahora suponga que x <- c(1,24,8) y uno <- c(T,T,F). ?Qué sucede si hacemos x[uno]? ?Y si hacemos x[as.double(uno)]?

x <- c(1,24,8)
uno <- c(T,T,F)
x[uno]
[1]  1 24
x[as.double(uno)]
[1] 1 1

Nota

Puede referirse a las diapositivas

Subindexado de listas

Las listas se pueden subindexar mediante los operadores [, [[ y $. Recordemos que cuando indexamos con [, el resultado siempre es del mismo tipo. Ahora suponga que tenemos la siguiente lista:

listaPrueba <- list(Mayusculas = LETTERS[1:15], Ciudades = c("Cancun", "Playa", "Chetumal", "Merida"), casos = list(a=23, b= 1:8, c=list(d=1,e=TRUE)))
valor_e <- listaPrueba$casos$b[3]
valor_e
[1] 3

Ejercicios (en base al objeto listaPrueba),

1.- ?Con qué comando puedo obtener la lista casos? str(listaPrueba[[3]]) 2.- ?Cómo puedo obtener el único valor lógico de listaPrueba? valor_e <- listaPrueba\(casos\)c$e valor_e

3.- ?Qué sucede si hago listaPrueba[[3]]$c[[2]], es esto equivalente a listaPrueba$casos[[3]][[2]]? Explique Lo que su sede es que listaPrueba[[3]]\(c[[2]] es igual a la listaPrueba\)casos[[3]][[2]], en el primer ejemplo ingresamos al dato 3 de la lista principal y de ahí a la sublista, y luego al dato 2, lo que queda como resultado es el valor booleano.

4.- ?Cuál es la diferencia entre listaPrueba[1] y listaPrueba[[1]]? imprime en pantalla el nombre de la casilla y los datos dentro de ella el otro solo imprime los elementos

5.- ?Cómo puedo obtener el objeto "Chetumal"? valor_e <- listaPrueba$Ciudades[3] valor_e

6.- ?Cómo puedo obtener el tercer elemento de b? valor_e <- listaPrueba\(casos\)b[3] valor_e

Indexado de matrices

Suponga que tenemos la matriz:

matriz1 <- matrix(rnorm(20), nrow=5)
r1 <- matriz1[c(1,2),c(3,4)]
r2 <- matriz1[1:2,c(3,4)] 

resultado <- identical(r1 , r2)

resultado
[1] TRUE

Ejercicios:

A partir de matriz1, hallar:

1.- La matriz que consta de las primeras dos columnas de matriz1. matriz1[,1:2]

2.- La matriz que consta de las primeras dos filas y dos columnas de matriz1. matriz1[1:2,1:2] 3.- La matriz que consta del elemento \(a_{2,3}\) de matriz1 matriz1[2,3]

4.- ?Son equivalentes los comandos matriz1[c(1,2),c(3,4)] y matriz1[1:2,c(3,4)]? (tip: puede probar con el comando identical)

r1 <- matriz1[c(1,2),c(3,4)] r2 <- matriz1[1:2,c(3,4)]

resultado <- identical(r1 , r2)

resultado

Subindexado de data.frame

El subindexado de data.frames es similar al subindexado por medio de listas y matrices. En este caso nos concentraremos en el paquete dplyr que permite manipular data.frames. Cualquier paquete en R se puede instalar mediante el comando install.packages(<nombre.paquete>), por ejemplo para instalar dplyr hacemos:

install.packages("dplyr", dependencies = TRUE)   # instalo el paquete
library(dplyr)         # Cargo el paquete para trabajar con sus funciones

Tarea:

1.- Investigar para qué sirve el paquete dplyr. El paquete dplyr es una herramienta muy útil en RStudio y en R en general para la manipulación y transformación de datos enmarcada en la programación funcional. dplyr se utiliza para realizar operaciones de manipulación de datos de manera eficiente, lo que facilita la exploración y el análisis de datos en R

2.- ?Cuáles son los comandos importantes del paquete dplyr? filter(): Filtra filas de un DataFrame en función de condiciones específicas. Por ejemplo, puedes usar filter() para seleccionar filas que cumplan con ciertos criterios.

select(): Selecciona columnas específicas de un DataFrame. Útil cuando solo deseas trabajar con un subconjunto de las variables.

mutate(): Crea nuevas columnas o modifica columnas existentes en un DataFrame. Puedes usarlo para calcular nuevas variables basadas en las existentes.

arrange(): Ordena filas de un DataFrame en función de una o más columnas. Puedes especificar el orden ascendente o descendente.

summarize() y group_by(): Son útiles para resumir datos agregados. group_by() permite agrupar datos por una o más columnas y summarize() se utiliza para resumir los datos dentro de cada grupo.

join(): Combina dos o más DataFrames en función de claves comunes. dplyr admite varios tipos de uniones, como inner join, left join, right join y full join.

rename(): Cambia el nombre de las columnas de un DataFrame.

distinct(): Encuentra filas únicas en un DataFrame, eliminando duplicados.

sample_n() y sample_frac(): Extrae aleatoriamente un número específico de filas o una fracción de filas de un DataFrame.

3.- Supongamos que tenemos un data.frame df <- data.frame(a=1:8, letras =letter[1:8]), qué sucede si aplico select(df, a). ?Y si aplico filter(df, a<5)?

df <- data.frame(a=1:8, letras=letters[1:8])
select(df,a) # imprime solo los elementos de a
  a
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
filter(df, a<5)
  a letras
1 1      a
2 2      b
3 3      c
4 4      d

Gráficos de funciones bidimensionales

Los gráficos permiten mostrar múltiples características de una función. Los máximos, mínimos, etc., son métricas que nos dicen mucho acerca del comportamiento de una función. R nos permite graficar funciones de manera sencilla utilizando el concepto de vector. Por ejemplo, quizás estemos interesados en conocer la forma de onda de la función seno acotada, la cual se define matemáticamente mediante la siguiente fórmula:

\[ f(t) = \begin{cases} \sin(2 \pi t) & \mbox{para} -1 < t < 1\\ 0 & \mbox{resto}. \end{cases} \] Y la cual en R se graficar? de la siguiente manera:

t  <- seq(-1, 1, length=100)
ft   <- sin(2*pi*t)           # Se calcula la funcion seno a partir de t
plot(t, ft, type="l", xlim=c(-4,4), ylim=c(-1.5,1.5), main="Funcion seno", xlab="tiempo", ylab="Valores")
grid()

## ejemplocon highcharter

x <- seq(-4,4, length=1000)
ft <- ifelse(x>-1 & x<1, sin(2*pi*x),0)
highchart() %>% hc_add_series(cbind(x,ft),name="Funcion seno") %>% hc_title(text="Funcion seno")

R permite añadir gráficos o puntos mediante las funciones lines() y points(). El siguiente código ejemplifica lo anterior.

t  <- seq(-3,3, length=200)
f1 <- sin(2*pi*(t))
f2 <- sin(2*pi*(t-1/4))
f3 <- sin(2*pi*(t-1/2))
plot(t,f1, type= "l", main="Funcion seno y versiones", xlab="tiempo", ylab="Valores")
grid()
lines(t,f2, col="red")
points(t,f3,col="blue")

De igual manera se pueden definir funciones por tramos con el comando ifelse(), por ejemplo grafiquemos la siguiente función:

\[ f(t) = \begin{cases} 2+t & \; -2<t<-1\\ 1 & \; -1<t<1\\ 2-t & \;1<t<2\\ 0 & \; \mbox{resto} \end{cases} \]

t <- seq(-3,3, length=100)
ft <- ifelse(t> -2 & t < -1, 2+t, ifelse(t>= -1 & t <= 1, 1, ifelse(t>1 & t< 2, 2-t, 0)))
plot(t, ft, type = "l", main="Funcion por tramos", xlab="tiempo", ylab="Valores")
grid()

Ejercicios:

Graficar las siguientes funciones:

\[ f(t) = \begin{cases} 1 & \; t>0\\ 0 & \; \mbox{resto} \end{cases} \]

t <- seq(0,1, length=100)
f <- t > 0
plot(t, f, type="l",col="red")

\[ f(t) = \begin{cases} 1+t & \; -1<t<0\\ 1-t & \; 0 \le t<1\\ 0 & \; \mbox{resto} \end{cases} \]

t <- seq(-3,3, length=100)
ft <- ifelse(t> -1 & t < 0, 1+t, ifelse(t>= 0 & t < 1, 1-t,0))
plot(t, ft, type = "l",col="red")
grid()

\[ f(t) = \begin{cases} \mbox{e}^{-2t} & \; 0<t<2\\ 1+t & \; -1<t<0\\ 0 & \; \mbox{resto} \end{cases} \]

t <- seq(-3,3, length=100)
ft <- ifelse(t> 0 & t < 2,exp(-2 * t) , ifelse(t> -1 & t < 0, 1+t,0))
plot(t, ft, type = "o",col="blue")
grid()

Gráficos 3D

Los gráficos en 3D permiten visualizar funciones del tipo: \(f(x,y)\), donde \(x\) e \(y\) representan variables independientes. Como ejemplo veamos la forma en la cual R grafica la siguiente funci?n \(f(x,y) = \sqrt{16-4x^2-y^2}\):

x <- seq(-2,2,length=50)
y <- seq(-4,4, length=50)
z <- outer(x,y,function(x,y) sqrt(16-4*x^2-y^2))
z[is.na(z)] <- 0
persp(x,y,z, theta=-30, expand=0.5,ticktype = "detailed")

persp(x,y,z, theta=30, expand=0.5, ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

Ejemplos: Ahora veamos la manera de hacerla con más funciones.

Ahora para la función \(z = y^2-x^2\)

x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) y^2-x^2)
persp(x,y,z, theta=-30, expand=0.6, ticktype = "detailed")

persp(x,y,z, theta=30, expand=0.6, ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

Ahora para la función \(f(x,y)= (2+x^2-y^2) \mbox{e}^{1-x^2-(y^2)/4}\)

x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) (2-y^2+x^2)*exp(1-x^2-(y^2)/4))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

Ejercicios:

Ejercicios para graficar superficies y contornos en R.
Ejercicios para graficar superficies y contornos en R.
x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x+y)
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) 6-(2*x)-(3*y))

persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

  x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) (x^2)+(4*y^2) )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) sqrt(9-(x^2)-(y^2) ) )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x*y )
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) exp((x*y)/2 ))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) x/((x^2)+(y^2)))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed")

image(x,y,z)
contour(x,y,z, add=TRUE)

x <- seq(-3,3,length=50)
y <- seq(-3,3, length=50)
z <- outer(x,y,function(x,y) log(x-y + 1e-6))
persp(x,y,z, theta=-30, expand=0.5, ticktype = "detailed", main = "perspective plot 1")

persp(x,y,z, theta=30,expand=0.5,ticktype = "detailed", main = "perspective plot 2")

image(x,y,z)
contour(x,y,z, add=TRUE)